#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <thread>
#include <string>

using namespace std;

string toHex(int num) // 转十六进制接口
{
    char ret[64];

    snprintf(ret, sizeof(ret), "%p", num);

    return ret;
}

void *threadroutine(void *args)
{
    while (true)
    {
        sleep(2);
        cout << "thread id: " << toHex(pthread_self()) << endl;
    }
    return nullptr;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadroutine, nullptr);

    while (true)
    {
        cout << "creat a new thread, id: " << toHex(tid) << endl;
        sleep(1);
    }

    pthread_join(tid, nullptr);
    return 0;
}

// #include <iostream>
// #include <unistd.h>
// #include <pthread.h>
// #include <thread>

// using namespace std;

// void threadrun()
// {
//     while(true)
//     {
//         cout << "I am a new thread for C++" << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     //创建线程
//     thread th(threadrun);
//     //线程等待
//     th.join();
//     return 0;
// }

// #include <iostream>
// #include <pthread.h>
// #include <vector>
// #include <string>
// #include <unistd.h>

// using namespace std;

// #define NUM 3

// class ThreaInfo
// {
// public:
//     ThreaInfo(const string &threadname)
//     :threadname_(threadname)
//     {}

// public:
//     string threadname_;
// };

// string toHex(pthread_t tid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "%p", tid);
//     return buffer;
// }

// void *threadroutine(void *args)
// {
//     int i = 0;
//     int num = 0;
//     ThreaInfo *ti = static_cast<ThreaInfo*>(args);
//     while(i < 10)
//     {
//         cout << ti->threadname_.c_str() << " is running, tid: " << toHex(pthread_self()) << ", pid: " << getpid()  << ", num: " << num << ", &num: " << toHex((pthread_t)&num) << endl;
//         i++;
//         num++;
//         usleep(10000);
//     }

//     return nullptr;
// }

// int main()
// {
//     vector<pthread_t> tids;
//     for(int i = 0; i < NUM; i++)
//     {
//         pthread_t tid;
//         ThreaInfo *ti = new ThreaInfo("Thread-"+to_string(i));
//         pthread_create(&tid, nullptr, threadroutine, ti);

//         tids.push_back(tid);
//         // sleep(1);
//         usleep(1000);

//     }

//     for(auto tid:tids)
//     {
//         pthread_join(tid, nullptr);
//     }
//     return 0;
// }

// #include <iostream>
// #include <unistd.h>
// #include <pthread.h>
// #include <string>
// #include <cstdlib>

// using namespace std;

// class Request
// {
// public:
//     Request(int start, int end, const string &threadname)
//     :start_(start)
//     ,end_(end)
//     ,threadname_(threadname)
//     {}

//     int sum()
//     {
//         int ret = 0;
//         for(int i = start_; i <= end_; i++)
//         {
//             cout << threadname_ << " is running..." << endl;
//             ret += i;
//             usleep(10000);
//         }
//         return ret;
//     }

// public:
//     int start_; // 起始数
//     int end_; // 终止数
//     string threadname_; // 线程的名字
// };

// class Response
// {
// public:
//     Response(int result, int exitcod)
//     :result_(result)
//     ,exitcode_(exitcod)
//     {}
// public:
//     int result_; // 计算结果
//     int exitcode_; // 标记结果的可靠性
// };

// void *SumCount(void *args)
// {
//     Request *rq = static_cast<Request *>(args);
//     Response *rp = new Response(rq->sum(), 0);

//     delete rq;
//     return rp;
// }

// int main()
// {
//     pthread_t tid;
//     // 创建一个线程
//     Request *rq = new Request(1, 100, "Thread 1");
//     pthread_create(&tid, nullptr, SumCount, rq);

//     void *ret;
//     pthread_join(tid, &ret); // 线程等待，获取线程的返回值
//     Response *rp = static_cast<Response *>(ret);

//     cout << "result: " << rp->result_ << ", exitcode: " << rp->exitcode_ << endl;
//     delete(rp);
//     return 0;
// }

// #include <iostream>
// #include <unistd.h>
// #include <pthread.h>

// using namespace std;

// int g_val = 100;

// void *threadRoutine(void *args)
// {
//     const char *name = (const char *)args;
//     int cnt = 5;
//     while (true)
//     {
//         printf("%s, pid: %d, g_val: %d, &g_val: 0X%p\n", name, getpid(), g_val, &g_val);
//         sleep(1);
//         cnt--;
//         if (cnt == 0)
//             break;
//     }

//     pthread_exit((void *)100);
// }

// int main()
// {
//     pthread_t pid;

//     pthread_create(&pid, nullptr, threadRoutine, (void *)"Thread 1");

//     void *ret;

//     pthread_join(pid, &ret);

//     cout << "main thread quit..., Thread 1 return val: " << (long long int)ret << endl;
//     return 0;
// }

// #include <iostream>
// #include <pthread.h>
// #include <unistd.h>

// void *threadRun(void* args)
// {
//     while(1)
//     {
//         std::cout << "new thread pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRun, nullptr);

//     while(1)
//     {
//         std::cout << "main thread pid: " << getpid() << std::endl;
//         sleep(1);
//     }
// }